package com.sky.aspect;

import com.sky.context.BaseContext;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.time.LocalDateTime;

@Aspect
@Component
@Slf4j
public class AutoFillAspect {

    @Pointcut("@annotation(com.sky.annotation.AutoInsertFill)")
    public void insert(){

    }
    @Pointcut("@annotation(com.sky.annotation.AutoUpdateFill)")
    public void update(){

    }
    @Before("insert()")
    public void autoInsertFill(JoinPoint joinPoint){
        // 获取原始方法的参数
        try {
            Object[] args = joinPoint.getArgs();
            Object arg = args[0];
            // 给这个参数赋值
//            Field createTime = arg.getClass().getDeclaredField("createTime");
//            Field updateTime = arg.getClass().getDeclaredField("updateTime");
//            Field createUser = arg.getClass().getDeclaredField("createUser");
//            Field updateUser = arg.getClass().getDeclaredField("updateUser");
//
//            createTime.setAccessible(true);
//            updateTime.setAccessible(true);
//            createUser.setAccessible(true);
//            updateUser.setAccessible(true);
//
//            createTime.set(arg, LocalDateTime.now());
//            updateTime.set(arg, LocalDateTime.now());
//            createUser.set(arg, BaseContext.getCurrentId());
//            updateUser.set(arg, BaseContext.getCurrentId());
            // 获取类的Class对象
            Class<?> clazz = arg.getClass();
            // 获取名为setMyProperties的方法
            Method setCreateTime = clazz.getMethod("setCreateTime", LocalDateTime.class);
            Method setUpdateTime = clazz.getMethod("setUpdateTime", LocalDateTime.class);
            Method setCreateUser = clazz.getMethod("setCreateUser", Long.class);
            Method setUpdateUser = clazz.getMethod("setUpdateUser", Long.class);
            // 准备要传递给setter方法的参数
            LocalDateTime now = LocalDateTime.now();
            Long currentId = BaseContext.getCurrentId();
            // 调用setter方法并传入参数
            setCreateTime.invoke(arg,now);
            setUpdateTime.invoke(arg,now);
            setCreateUser.invoke(arg,currentId);
            setUpdateUser.invoke(arg,currentId);



        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    @Before("update()")
    public void autoUpdateFill(JoinPoint joinPoint){
        // 获取原始方法的参数
        try {
            Object[] args = joinPoint.getArgs();
            Object arg = args[0];
            // 获取类的Class对象
            Class<?> clazz = arg.getClass();
            // 获取名为setMyProperties的方法
            Method setUpdateTime = clazz.getMethod("setUpdateTime", LocalDateTime.class);
            Method setUpdateUser = clazz.getMethod("setUpdateUser", Long.class);
            // 准备要传递给setter方法的参数
            LocalDateTime now = LocalDateTime.now();
            Long currentId = BaseContext.getCurrentId();
            // 调用setter方法并传入参数
            setUpdateTime.invoke(arg,now);
            setUpdateUser.invoke(arg,currentId);



        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}
